package com.tester.yaa.exam001.reflex;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Aduthor yinanan
 * @ClassName PersonReflex
 * @Date 2022/12/4 16:01
 * @Description TODO
 **/
public class PersonReflex {
    
    /** 
    * @Description: //执行
    * @author: yinanan
    * @Param: [args]
    * @return: void  
    * @Date: 2022/12/4
    */ 
    public static void main(String[] args) throws Exception {
        setval(Person.class);
    }
    
    /** 
    * @Description: //根据反射给Person类设置参数值
    * @author: yinanan
    * @Param: [entity]
    * @return: T  
    * @Date: 2022/12/4
    */ 
    private static <T> T setval(Class<T> entity) throws Exception {
        //获取到反射的类
        T t = entity.newInstance();
        //获取该类各个参数
        Field[] declaredFields = entity.getDeclaredFields();
        for (Field f : declaredFields) {
            //获取Person类的属性名称
            String name = f.getName();
            //获取Person类参数类型
            Class<?> type = f.getType();
            //获取Person类参数构造参数名称
            String suf = name.substring(0, 1).toUpperCase() + name.substring(1);
            Method setMethod = entity.getMethod("set" + suf, type);
            //有多种实现方式：1、通过属性名称给各个属性赋值；2、通过参数类型给属性赋值
            //通过属性名称给各个属性赋值
            if("name".equals(name)){
                setMethod.invoke(t, "jason");
            }else if("age".equals(name)){
                setMethod.invoke(t, 18);
            }else if("address".equals(name)){
                setMethod.invoke(t, "guang zhou China");
            }
            //通过参数类型给属性赋值（此处按照数据类型统一赋值，不满足该功能，舍弃）
            /*if (type.isAssignableFrom(String.class)) {
                setMethod.invoke(t, "jason");
            } else if (type.isAssignableFrom(Integer.class)) {
                setMethod.invoke(t, 18);
            } else {
                setMethod.invoke(t, setval(type));
            }*/
        }
        System.out.println("打印---->：" + t.toString());
        return t;
    }
}
